using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using MakeIT.Framework.Util;
using MakeIT.MakeIT.Laundy.Agromotor.Site.Entidades;
using MakeIT.MakeIT.Laundy.Agromotor.Site.Negocios;

namespace MakeIT.MakeIT.Laundy.Agromotor.Site.Apresentacao
{
	public partial class CadastroCategoria : System.Web.UI.Page
	{

		UsuarioVO usuarioVO = null;

		protected void Page_Load(object sender, EventArgs e)
		{
			usuarioVO = (UsuarioVO)this.Session["userActive"];

			if (!IsPostBack)
			{
				Util.HabilitarCampos(false, this.panelCad);
			}

		}

		/// <summary>
		/// Manipula o evento do botão btnSalvar
		/// </summary>
		/// <param name="sender">Objeto disparador do evento</param>
		/// <param name="e">Argumento do evento</param>
		protected void btnSalvar_Click(object sender, EventArgs e)
		{

			//Declara objetos
			CategoriaVO categoriaVO = null;
			bool novoRegistro = false;

			try
			{
				//Verifica se o ID é nulo, se sim = cadastro novo
				if (string.IsNullOrEmpty(this.txtCadIdCategoria.Text))
				{
					categoriaVO = CategoriaVO.CreateVO();
					categoriaVO.cadastro = DateTime.Now;
					categoriaVO.cadastradoPor = usuarioVO.user;

					novoRegistro = true;

				}
				//Recupera dados para serem alterados
				else
				{
					//Recupera dados
					categoriaVO = AgromotorsiteDAO.getCategoria(Int32.Parse(this.txtCadIdCategoria.Text));
				}

				categoriaVO.categoria = this.txtCadCategoria.Text;
				categoriaVO.edicao = DateTime.Now;
				categoriaVO.editadoPor = usuarioVO.user;

                //Salva Alternativas
                this.chaveVOs = (List<KeyValueVO>)this.Session["chaveVOs"];
                string chaves = "|";
                foreach (KeyValueVO chave in this.chaveVOs)
                {
                    chaves += chave.Value + "|";
                }
                categoriaVO.chaves = chaves;
                
                //Chama metodo para salvar ou criar novo registro
				if (novoRegistro)
					categoriaVO.idCategoria = (int)AgromotorsiteDAO.newCategoria(categoriaVO);
				else
					AgromotorsiteDAO.setCategoria(categoriaVO);

				// Exibe msg de sucesso ao salvar registro
				Util.ExibeAlert(this, "Registro salvo com sucesso!");

				//Popula grid atualizado
				this.btnPesquisa_Click(null, null);

				//Atualiza formulario, apos salvar os dados
				this.txtCadIdCategoria.Text = categoriaVO.idCategoria.ToString();
				this.ltCadastradoPor.Text = categoriaVO.cadastradoPor;
				this.ltEditadoPor.Text = categoriaVO.editadoPor;
				this.ltDataCadastro.Text = categoriaVO.cadastro.ToString("dd/MM/yyyy");
				this.ltDataEdicao.Text = categoriaVO.edicao.ToString("dd/MM/yyyy");

			}
			catch (Exception ex)
			{

				throw ex;
			}
		}

		/// <summary>
		/// Manipula o evento do botão btnPesquisa
		/// </summary>
		/// <param name="sender">Objeto disparador do evento</param>
		/// <param name="e">Argumento do evento</param>
		protected void btnPesquisa_Click(object sender, EventArgs e)
		{

			//Declara objetos
			int? idCategoria = null;
			string categoria = null;
			string chaves = null;

			try
			{

				if (!string.IsNullOrEmpty(this.txtIdCategoria.Text))
				{
					idCategoria = Int32.Parse(this.txtIdCategoria.Text);
				}

				if (!string.IsNullOrEmpty(this.txtCategoria.Text))
				{
					categoria = this.txtCategoria.Text;
				}

				if (!string.IsNullOrEmpty(this.txtChaves.Text))
				{
					chaves = this.txtChaves.Text;
				}


				//Recupera a lista de registros segundo a pesquisa
				this.grvResultado.DataSource = AgromotorsiteDAO.getCategorias(idCategoria, categoria, chaves);

				//Vincula os dados
				this.grvResultado.DataBind();
			}
			catch (Exception ex)
			{

				throw ex;
			}
		}

		/// <summary>
		/// Manipula o evento do botão btnCancelar
		/// </summary>
		/// <param name="sender">Objeto disparador do evento</param>
		/// <param name="e">Argumento do evento</param>
		protected void btnCancelar_Click(object sender, EventArgs e)
		{
			//Volta para a tab page de pesquisa
			//this.tabCategoria.ActiveTabIndex = 0;

            //Volta chaves
            this.chaveVOs = null;
            if (!string.IsNullOrEmpty(this.txtCadIdCategoria.Text))
            {
                CategoriaVO cVO = AgromotorsiteDAO.getCategoria(int.Parse(this.txtCadIdCategoria.Text));
                if (!string.IsNullOrEmpty(cVO.chaves))
                {
                    this.chaveVOs = new List<KeyValueVO>();
                    string[] chaves = cVO.chaves.Split('|');
                    for (int index = 0; index < chaves.Length; index++)
                    {
                        if (!string.IsNullOrEmpty(chaves[index]))
                        {
                            this.chaveVOs.Add(KeyValueVO.CreateVO(chaves[index],chaves[index]));
                        }
                    }
                }
            }
            this.grvCadCategoriaXChaves.ShowFooter = false;
            this.grvCadCategoriaXChaves.Columns[1].Visible = false;
            this.grvCadCategoriaXChaves_FillAtributosInGrid();
            
            // Desabilita os campos para edição
			Util.HabilitarCampos(false, this.panelCad);

			// Destrava botão de edição
			this.btnEditar.Enabled = (!string.IsNullOrEmpty(this.txtCadIdCategoria.Text));

			// Destrava botão de exclusao
			this.btnExcluir.Enabled = (!string.IsNullOrEmpty(this.txtCadIdCategoria.Text));

			// Detrava botão de novo
			this.btnNovo.Enabled = true;

			// Desabilita o botão salvar
			this.btnSalvar.Enabled = false;

		}

		protected void imgbVisualizar_Click(object sender, ImageClickEventArgs e)
		{
			// Declara objetos
			CategoriaVO categoriaVO = null;
			int idCategoria = 0;

			try
			{
				//Recupera os argumentos com o ID do objeto
				string[] argumentos = ((ImageButton)sender).CommandArgument.Split(';');
				idCategoria = Int32.Parse(argumentos[0]);

				//Recupera o objeto
				categoriaVO = AgromotorsiteDAO.getCategoria(idCategoria);

				this.txtCadIdCategoria.Text = categoriaVO.idCategoria.ToString();
				this.txtCadCategoria.Text = categoriaVO.categoria;
				this.ltCadastradoPor.Text = categoriaVO.cadastradoPor;
				this.ltEditadoPor.Text = categoriaVO.editadoPor;
				this.ltDataCadastro.Text = categoriaVO.cadastro.ToString("dd/MM/yyyy");
				this.ltDataEdicao.Text = categoriaVO.edicao.ToString("dd/MM/yyyy");

                //Recuperar chaves
                this.chaveVOs = null;
                if (!string.IsNullOrEmpty(categoriaVO.chaves))
                {
                    this.chaveVOs = new List<KeyValueVO>();
                    string[] chaves = categoriaVO.chaves.Split('|');
                    for (int index = 0; index < chaves.Length; index++)
                    {
                        if (!string.IsNullOrEmpty(chaves[index]))
                        {
                            this.chaveVOs.Add(KeyValueVO.CreateVO(chaves[index],chaves[index]));
                        }
                    }
                }
                this.grvCadCategoriaXChaves.ShowFooter = false;
                this.grvCadCategoriaXChaves.Columns[1].Visible = false;
                this.grvCadCategoriaXChaves_FillAtributosInGrid();
                
                //Habilita tab page do cadastro
				this.tabCategoria.ActiveTabIndex = 1;

				//Desabilita campos para edição
				Util.HabilitarCampos(false, this.panelCad);

				//Desabilita botão salvar
				this.btnSalvar.Enabled = false;

				//Habilita botão editar
				this.btnEditar.Enabled = true;

				//Habilita botão excluir
				this.btnExcluir.Enabled = true;

				//Habilita botão novo
				this.btnNovo.Enabled = true;

			}
			catch (Exception ex)
			{

				throw ex;
			}
		}

		// <summary>
		// Manipula o evento editar do web form
		// </summary>
		// <param name="sender">Objeto disparador de evento</param>
		// <param name="e">Argumento do evento</param>
		protected void btnEditar_Click(object sender, EventArgs e)
		{
			// Habilita os campos para edição
			Util.HabilitarCampos(true, this.panelCad);

            // Habilitar chaves
            this.chaveVOs = (List<KeyValueVO>)this.Session["chaveVOs"];
            this.grvCadCategoriaXChaves.ShowFooter = true;
            this.grvCadCategoriaXChaves.Columns[1].Visible = true;
            this.grvCadCategoriaXChaves_FillAtributosInGrid();
            
            // Trava apenas os text box da PK
			this.txtCadIdCategoria.Enabled = false;

			// Trava botão de edição
			this.btnEditar.Enabled = false;

			// Trava botão de exclusao
			this.btnExcluir.Enabled = false;

			// Trava botão de novo
			this.btnNovo.Enabled = false;

			// Habilita o botão salvar
			this.btnSalvar.Enabled = true;

			this.txtCadCategoria.Focus();
		}

		protected void btnNovo_Click(object sender, EventArgs e)
		{
			//Limpa formulario, para a entrada de novo registro
			Util.LimparCampos(this.panelCad);
			// Habilita os campos para edição
			Util.HabilitarCampos(true, this.panelCad);

			this.ltCadastradoPor.Text = "";
			this.ltEditadoPor.Text = "";
			this.ltDataCadastro.Text = "";
			this.ltDataEdicao.Text = "";

            // Habilitar alternativas
            this.chaveVOs = null;
            this.grvCadCategoriaXChaves.ShowFooter = true;
            this.grvCadCategoriaXChaves.Columns[1].Visible = true;
            this.grvCadCategoriaXChaves_FillAtributosInGrid();
            
            // Trava apenas os text box da PK
			this.txtCadIdCategoria.Enabled = false;

			// Trava botão de edição
			this.btnEditar.Enabled = false;

			// Trava botão de exclusao
			this.btnExcluir.Enabled = false;

			// Trava botão de novo
			this.btnNovo.Enabled = false;

			// Habilita o botão salvar
			this.btnSalvar.Enabled = true;

			this.txtCadCategoria.Focus();

		}

		protected void btnExcluir_Click(object sender, EventArgs e)
		{
			//Declara objetos
			CategoriaVO categoriaVO = null;

			try
			{
				//Cria objeto
				categoriaVO = CategoriaVO.CreateVO();
				categoriaVO.idCategoria = Int32.Parse(this.txtCadIdCategoria.Text);

				//verifica se tem peca dependentes deste registro
				if (AgromotorsiteDAO.getCountPecaxIdCategoria(categoriaVO.idCategoria) > 0)
				{
					Util.ExibeAlert(this, "Há Peças(s) associado(s) a este registro. Exclusão não permitida");
					return;
				}

				//Chama metodo para excluir registro
				AgromotorsiteDAO.delCategoria(categoriaVO);

                // Habilitar alternativas
                this.chaveVOs = null;
                this.grvCadCategoriaXChaves.ShowFooter = false;
                this.grvCadCategoriaXChaves.Columns[1].Visible = false;
                this.grvCadCategoriaXChaves_FillAtributosInGrid();
                
                // Exibe msg de sucesso ao salvar registro
				Util.ExibeAlert(this, "Registro excluido com sucesso!");

				//Popula grid atualizado
				this.btnPesquisa_Click(null, null);

				//Limpa formulario, apos salvar os dados
				Util.LimparCampos(this.panelCad);
				this.ltCadastradoPor.Text = "";
				this.ltEditadoPor.Text = "";
				this.ltDataCadastro.Text = "";
				this.ltDataEdicao.Text = "";

				// Trava botão de edição
				this.btnEditar.Enabled = false;

				// Trava botão de exclusao
				this.btnExcluir.Enabled = false;

				// Desabilita o botão salvar
				this.btnSalvar.Enabled = false;

				// Habilita o botao novo
				this.btnNovo.Enabled = true;

			}
			catch (Exception ex)
			{

				throw ex;
			}
			
		}


        #region CategoriaXChave
        List<KeyValueVO> chaveVOs;

        private void grvCadCategoriaXChaves_FillAtributosInGrid()
        {
            if (this.chaveVOs == null)
                this.chaveVOs = new List<KeyValueVO>();

            this.Session["chaveVOs"] = this.chaveVOs;

            if (this.chaveVOs.Count > 0)
            {
                this.grvCadCategoriaXChaves.DataSource = this.chaveVOs;
                this.grvCadCategoriaXChaves.DataBind();
            }
            else
            {
                List<KeyValueVO> tempchave = new List<KeyValueVO>();
                tempchave.Add(KeyValueVO.CreateVO("",""));
                this.grvCadCategoriaXChaves.DataSource = tempchave;
                this.grvCadCategoriaXChaves.DataBind();
                int TotalColumns = grvCadCategoriaXChaves.Rows[0].Cells.Count;
                grvCadCategoriaXChaves.Rows[0].Cells.Clear();
                grvCadCategoriaXChaves.Rows[0].Cells.Add(new TableCell());
                grvCadCategoriaXChaves.Rows[0].Cells[0].ColumnSpan = TotalColumns;
                grvCadCategoriaXChaves.Rows[0].Cells[0].Text = "Nenhuma chave encontrada";
            }
        }

        protected void grvCadCategoriaXChaves_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
            }
        }

        protected void grvCadCategoriaXChaves_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName.Equals("AddNew"))
            {
                this.chaveVOs = (List<KeyValueVO>)this.Session["chaveVOs"];

                String chave = ((TextBox)grvCadCategoriaXChaves.FooterRow.FindControl("txtCadNewChave")).Text;

                this.chaveVOs.Add(KeyValueVO.CreateVO(chave,chave));
                grvCadCategoriaXChaves_FillAtributosInGrid();
            }
        }

        protected void grvCadCategoriaXChaves_RowEditing(object sender, GridViewEditEventArgs e)
        {
            grvCadCategoriaXChaves.EditIndex = e.NewEditIndex;
            this.chaveVOs = (List<KeyValueVO>)this.Session["chaveVOs"];
            grvCadCategoriaXChaves_FillAtributosInGrid();
        }

        protected void grvCadCategoriaXChaves_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            grvCadCategoriaXChaves.EditIndex = -1;
            this.chaveVOs = (List<KeyValueVO>)this.Session["chaveVOs"];
            grvCadCategoriaXChaves_FillAtributosInGrid();
        }

        protected void grvCadCategoriaXChaves_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            this.chaveVOs = (List<KeyValueVO>)this.Session["chaveVOs"];
            KeyValueVO kvVO = this.chaveVOs[e.RowIndex];
            kvVO.Value = ((TextBox)grvCadCategoriaXChaves.Rows[e.RowIndex].FindControl("txtCadChave")).Text;

            grvCadCategoriaXChaves.EditIndex = -1;
            grvCadCategoriaXChaves_FillAtributosInGrid();
        }

        protected void grvCadCategoriaXChaves_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            this.chaveVOs = (List<KeyValueVO>)this.Session["chaveVOs"];

            KeyValueVO kvVO = chaveVOs[e.RowIndex];
            chaveVOs.RemoveAt(e.RowIndex);
            grvCadCategoriaXChaves_FillAtributosInGrid();
        }
        #endregion
    
    
    }
}
